package org.uca.dss.curso1011.grupo9;

import java.util.ArrayList;
import java.util.List;
import org.joda.time.LocalDate;
import org.joda.time.LocalTime;

/**
 * Modelo de los viajes
 * @author eldruin
 */
public class Viaje {
    private int codigoViaje;
    private LocalDate fechaInicio;
    private LocalDate fechaFin;
    private List<Trayecto> trayectos;

    /**
     * Constructor
     * @param codigoViaje
     * @param fechaInicio
     * @param fechaFin
     * @param trayectos
     */
    Viaje (int codigoViaje, LocalDate fechaInicio, LocalDate fechaFin,
           List<Trayecto> trayectos)
    {
        this.codigoViaje = codigoViaje;
        this.fechaInicio = fechaInicio;
        this.fechaFin = fechaFin;
        this.trayectos = new ArrayList<Trayecto>();
        if (trayectos != null)
            this.trayectos.addAll(trayectos);
    }

    /**
     * Constructor de copia
     * @param v
     */
    Viaje(Viaje v)
    {
        codigoViaje = v.codigoViaje;
        fechaInicio = v.fechaInicio;
        fechaFin = v.fechaFin;
        trayectos = new ArrayList<Trayecto>();
        if (v.trayectos != null)
            trayectos.addAll(v.trayectos);
    }


    public static void init() throws Exception {
    }

    /**
     * Calcula el número mínimo de asientos entre los trenes que cubren todos
     * los trayectos que contiene el viaje
     * @return número mínimo de asientos de los trenes
     */
    public int numeroAsientosDisponibles()
    {
        int min_asientos = Integer.MAX_VALUE;

        for (Trayecto t : trayectos) {
            if (min_asientos > t.numeroAsientosTren())
                min_asientos = t.numeroAsientosTren();
        }

        if (trayectos == null)
            min_asientos = 0;

        return min_asientos;
    }

    /**
     * Calcula el precio total del viaje sumando el precio de cada trayecto
     * @return precio total del viaje
     */
    public double calcularPrecioViaje()
    {
        double precio = 0;

        for (Trayecto t : trayectos)
            precio += t.calcularPrecio();

        return precio;
    }

    /**
     * @return ciudad de origen del viaje
     */
    public String ciudadOrigen()
    {
        return (trayectos.get(0).getCiudadOrigen());
    }

    /**
     * @return ciudad de destino del viaje
     */
    public String ciudadDestino()
    {
        return (trayectos.get(trayectos.size()-1).getCiudadDestino());
    }

    /**
     * @return hora de salida del viaje
     */
    public LocalTime horaSalida()
    {
        return (trayectos.get(0).getHoraSalida());
    }

    /**
     * @return hora de llegada al destino del viaje
     */
    public LocalTime horaLlegada()
    {
        return (trayectos.get(trayectos.size()-1).getHoraLlegada());
    }

    /**
     * Añade un trayecto al viaje actual
     * @param trayecto
     * @return si se ha podido añadir true, false en caso contrario
     */
    public boolean addTrayecto(Trayecto trayecto)
    {
        return (trayectos.add(trayecto));
    }

    /**
     * @return número de trayectos del viaje
     */
    public int numeroTrayectos()
    {
        return (trayectos.size());
    }

    /**
     * @return código del viaje como string
     */
    public String codigo()
    {
        String cod = new String();
        cod = Integer.toString(getcodigoViaje());
        cod += getFechaInicio().toString();
        return cod;
    }

    /**
     * @return codigo del viaje como int
     */
    public int getcodigoViaje() {
        return codigoViaje;
    }

    /**
     * @return fecha de inicio del viaje
     */
    public LocalDate getFechaInicio() {
        return fechaInicio;
    }

    /**
     * Ajusta la fecha de inicio del vije
     */
    public void setFechaInicio(LocalDate fecha) {
         fechaInicio = fecha;
    }

    /**
     * @return fecha de fin del viaje
     */
    public LocalDate getFechaFin() {
        return fechaFin;
    }

    /**
     * @return lista de trayectos del viaje
     */
    public List<Trayecto> getTrayectos() {
	return trayectos;
    }
}
